package _99练习;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

public class CollectionExercise {
	public static void main(String args[]) {
		// 1.
		// 将一些汽车品牌的名字放入一个容器
		// 将一些汽车品牌的名字放入第二个容器
		// 容器1移除某个汽车品牌
		// 显示容器1中汽车品牌的数量
		// 判断容器1中是否含有 奥迪
		// 得到两个容器的交集
		// 判断容器2中是否空
		// 清空容器2
		// 判断容器2中是否空
		Collection c = new ArrayList();
		Collection c1 = new ArrayList();
		c.add("BYD");
		c.add("BMW");
		c.add("VOLVO");
		System.out.println(c);
		c1.add("奔驰");
		c1.add("奥迪");
		c1.add("BYD");
		System.out.println(c1);
		c.remove("BMW");
		System.out.println(c);
		System.out.println("数量:" + c.size());
		System.out.println(c.contains("奥迪"));
		c.retainAll(c1);
		System.out.println(c);
		System.out.println(c1.isEmpty());
		c1.clear();
		System.out.println(c1.isEmpty());

		// 2.
		// 定义多个容器
		// 随机10个(1~20)数放入容器1
		// 随机10个(1~30)数放入容器2
		// 将容器1和容器2中所有内容放入容器3
		// 将容器1和容器2中的交集放入容器4(不改变容器1和容器2)
		// 打印4个容器中的内容
		Collection q = new HashSet();
		Collection w = new HashSet();
		Collection e = new HashSet();
		Collection r = new HashSet();
		for (int i = 0; i <= 10; i++) {
			q.add((int) (Math.random() * 20) + 1);

		}System.out.println(q);
		
		for (int i = 0; i <= 10; i++) {
			w.add((int) (Math.random() * 30) + 1);

		}System.out.println(w);
		
		e.addAll(q);
		e.addAll(w);
		System.out.println(e);

		q.retainAll(w);
		r.add(q);
		System.out.println(r);

		// 迭代器练习
		// 3.
		// 使用迭代器 遍历显示练习1的容器
		// 使用迭代器 删除练习1容器中的奥迪

		// 使用加强型for 遍历显示练习1中的容器

		c1.add("奔驰");
		c1.add("奥迪");
		c1.add("BYD");
		Iterator<String> itor = c1.iterator();
		while (itor.hasNext()) {
			System.out.println(itor.next());
		}
//			while(itor.hasNext())
//			{
//				String tmp = itor.next();
//				if(tmp.equals("奥迪"))
//				{
//					itor.remove();
//				}
//			}
//			System.out.println(c1);
		// 4. 定义一个员工类Employee
		// 创建一个容器存入以下信息
		// 1001 乔布斯 销售部
		// 1002 盖茨 工程部
		// 1003 赵云 客服部
		// 使用迭代器 1001编号的员工
		Collection em = new ArrayList();
		
		em.add(new Employee(1001,"乔布斯","销售部"));
		em.add(new Employee(1002,"盖茨","工程部"));
		em.add(new Employee(1003,"赵云","客服部"));
		System.out.println(em);
		Iterator<Employee> a = em.iterator();
		while(a.hasNext())
		{
			Employee ee=a.next();
			if(ee.id==1001) {
				System.out.println(ee);
			}
			
		}
		

		
		
		// 三 List练习
		// 5. 创建两个List容器对象l1 l2
		// l1 添加 "A" "B" "C" 三个元素
		// l2 添加 "D" "E" "F" "Egg" "Eee"
		// 将l2的中的所有元素加入到l1中
		// 修改
		// 将l1中索引为2位置的改为"Z"
		// 显示、获取
		// 打印显示l1 l2的大小
		// 显示l1中下标为1的元素
		// 删除
		// 将l1中索引为1的对象删除
		// 将l1中第一个内容为"B"的对象删除
		List<String> l1 = new ArrayList<>();
		l1.add("A");
		l1.add("B");
		l1.add("C");
		System.out.println(l1);
		List<String> l2 = new ArrayList<>();
		l1.add("D");
		l1.add("E");
		l1.add("F");
		l1.add("Egg");
		l1.add("Eee");
		
		l1.addAll(l2);
		l1.set(2, "Z");
		System.out.println(l1);
		System.out.println(l1.get(1));
		l1.remove(1);
		l1.remove("B");
		System.out.println(l1);
		
		// 6. 让用户输入数字，放入Set容器，直到这个Set容器中有10个不同的数字
//		Scanner sc=new Scanner(System.in);
//		Set s1 = new HashSet(); 
//		do {
//			int num=sc.nextInt();
//			s1.add(num);
//		}
//		while(s1.size()!=10) ;
//		System.out.println(s1);
		// 7. 定义一个员工类	(Employee 员工编号 姓名 工资)
		
		
//		Set s2 = new HashSet();
//		s2.add(new Employee2(1,"张三",1000));
//		s2.add(new Employee2(2,"李四",2000));
//		s2.add(new Employee2(3,"王五",3000)); 
//      System.out.println(s2);
		
		
		// 7.1 将3个员工放入一个HashSet容器（使用Eclipse生成 equals hashcde 只判断工号)
//		Set s3 = new HashSet();
//		s3.add(new Employee2(1,"张三",1000));
//		s3.add(new Employee2(1,"李四",2000));
//		s3.add(new Employee2(3,"王五",3000)); 	
//		System.out.println(s3);
		
		
		// 7.2 将3个员工放入一个TreeSet容器 (Employee需要实现Comparable接口) 
//		Set s4 = new TreeSet();
//		s4.add(new Employee2(1,"张三",1000));
//		s4.add(new Employee2(2,"李四",2000));
//		s4.add(new Employee2(3,"王五",3000)); 
//		System.out.println(s4);
		
		
		// (Map练习)
		// (Map练习)
				// 8 
				// 8.1
				// 将以下信息放入Map容器
				// 书的编号    书名
				// ISBN-001 iOS开发从入门到窒息
				// ISBN-002 Python从入门到出家
				// ISBN-003 Eclipse从安装的到卸载
		Map<String,String> m1 = new LinkedHashMap<>();
		m1.put("ISBN-001", "iOS开发从入门到窒息");
		m1.put("ISBN-002", "Python从入门到出家");
		m1.put("ISBN-003", "Eclipse从安装的到卸载");
		System.out.println(m1);
				// 8.2
				// 将以下信息放入Map容器
				// 书的编号    书名					价格
				// ISBN-001 iOS开发从入门到窒息		17.5
				// ISBN-002 Python从入门到出家		30
				// ISBN-003 Eclipse从安装的到卸载	45
		Map<String,Book> m2 = new LinkedHashMap<>();
		m2.put("ISBN-001",new Book("ISBN-001", "iOS开发从入门到窒息",17.5));
		m2.put("ISBN-002",new Book("ISBN-002", "Python从入门到出家",30));
		m2.put("ISBN-003", new Book("ISBN-003","Eclipse从安装的到卸载",45));
		System.out.println(m2);
				
		
				// * 9. (Map练习)
//				 String str = "adfasdfer23cvt323446dfs23423sdfadhdsfg";
				// 一个包含英文字母及数字的长字符串，可以随便敲写字母
				// 统计字符串中字母及数字出现的次数，使用map保存
				// 打印并显示结果(输出时按照字母顺序输出)
				// 如下:
				// a 2个
				// b 9个
	
		String str = "adfasdfer23cvt323446dfs23423sdfadhdsfg";	
		Map<Character,Integer> m = new TreeMap<>();
		for(int i=0;i<str.length();i++)
		{
			// 得到字符
			char ch = str.charAt(i);
			// 判断当前容器是否已有
			if(m.get(ch)==null)
			{
				// 放入容器
				m.put(ch, 1);
			}
			else
			{
				// 数值+1
				m.put(ch, m.get(ch)+1);
			}
		}
		for(Character ch:m.keySet())
		{
			System.out.println(c+" "+m.get(ch)+"个");
		}
		
		
		// Queue Deque练习
		// 10. 编写一个银行取号叫号系统BankServiceSystem
		// 类中需要: 
			// 定义一个队列保存排队的号码，
			// 需要定义一个变量保存下一个取的号码是多少
			// 
		// 提供一个方法 用户取号 getNum() 
			// 调用该方法 显示: 顾客取号，号码为:XX,前面还有几位顾客在等待
			// 				（下一个号码放入队列，下一个号码+1）
		// 提供一个方法 窗口叫号 callNum()
			// 调用该方法 显示: 窗口叫号,请编号为xx的顾客到窗口办理业务
						// 窗口叫号,当前没有排队的顾客
						// 	（判断当前队列是否为空，如果空则打印没有顾客，有则将队首出队列）
		// 用以下代码测试:
		// BankServiceSystem b = new BankServiceSystem();
		// b.getNum();
		// b.getNum();
		// b.getNum();
		// b.getNum();
		// b.callNum()
		// b.callNum()
		// b.callNum()
		// b.callNum()
		// b.callNum()
		// b.callNum()

		BankServiceSystem b=new BankServiceSystem();
		b.getNum();
		b.getNum();
		b.getNum();
		b.callNum();
		b.callNum();
		b.callNum();
		
		// 栈结构练习

		// 11 
		// 1. 小明往一个竹筒形状的容器里装了20个有编号(1-20的)球,一端开口一端封闭
		// 2. 然后取出3个球,	pop
		// 3. 然后随机从已倒出的所有球中随机拿一个放回去	push
		// 4 循环执行2,3直到竹筒中全部倒出,倒空了就不塞回去了
		// 打印过程中的状况(取出的 竹筒中剩余的)
		
		// Collections练习
				// 12
				// 定义学生类Student 
				// 学号 姓名 语文 数学 外语
				// 1001  张三  100 95 76
				// 1002  李四  95  76 88
				// 1003  王五  79 88  75
				// 1004  赵六  95  60  83
		
				// 创建一个集合容器存放血神数据
				// 1. 使用Collections工具类想集合容器中添加多个学生
				// 2. 打乱顺序，打印输出
				// 3. 排序，根据学生的总成绩，从高到低排序，打印输出
		List<Student> ls = new ArrayList<>();
		ls.add(new Student(1001,"张三",100,95,76));
		ls.add(new Student(1002,"李四",95,76,88));
		ls.add(new Student(1003,"王五",79,88,75));
		ls.add(new Student(1004,"赵六",95,60,83));
		System.out.println(ls);
		Collections.shuffle(ls);
		System.out.println(ls);
		Collections.sort(ls,new Comparator<Student>() {


			@Override
			public int compare(Student o1, Student o2) {
				// TODO Auto-generated method stub
				if(o1.Sum()<o2.Sum()) return 1;
				else if(o1.Sum()>o2.Sum()) return -1;
				return 0;
			}

			
			
		});
		System.out.println(ls);
	}
		
		

	}